﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Configuration;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using ServisniList.Core;

namespace ServisniList
{
    public partial class ServisniListPretraga : Form
    {

        #region Fields

        private DataModelDataContext context = null;

        #endregion

        #region Properties

        public string OdabraniServisniListBbroj { get; set; }

        #endregion

        #region Constructor

        public ServisniListPretraga()
        {
            InitializeComponent();
            servisniListVizualDataGridView.EnterEvent += servisniListVizualDataGridView_EnterEvent;
            context = new DataModelDataContext(ConfigurationManager.ConnectionStrings["ServisniListConnectionString"].ConnectionString);
            servisniListVBS.DataSource = dohvatiListoveUzavisnostiOKorisniku(Rukovatelji.Korisnici.GetInstance().TreutnoUlogiraniDjelatnik.Administrator);
        }

        #endregion

        #region Event handlers

        protected override void OnKeyDown(KeyEventArgs e)
        {
            base.OnKeyDown(e);
            if (e.KeyCode == Keys.Escape)
                this.Close();
        }

        private void ServisniListPretraga_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (context != null)
            {
                context.Dispose();
            }
        }

        private void txtVrijednost_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == (char)Keys.Return)
            {
                trazi();
            }
        }

        private void btnTrazi_Click(object sender, EventArgs e)
        {
            trazi();
        }

        private void servisniListVizualDataGridView_DoubleClick(object sender, EventArgs e)
        {
            ServisniListVizual sItem = ((ServisniListVizual)((DataGridView)sender).SelectedRows[0].DataBoundItem);
            if (sItem != null)
            {
                this.OdabraniServisniListBbroj = sItem.BrojLista;
                this.Close();
            }
        }

        private void servisniListVizualDataGridView_EnterEvent(object sender, EventArgs e)
        {
            ServisniListVizual sItem = ((ServisniListVizual)((DataGridView)sender).SelectedRows[0].DataBoundItem);
            if (sItem != null)
            {
                this.OdabraniServisniListBbroj = sItem.BrojLista;
                this.Close();
            }
        }

        #endregion

        #region Methods

        private void trazi()
        {
            var listovi = dohvatiListoveUzavisnostiOKorisniku(Rukovatelji.Korisnici.GetInstance().TreutnoUlogiraniDjelatnik.Administrator);
            servisniListVBS.DataSource = listovi.Where(new Func<ServisniListVizual, bool>(provjeriDaLiElementOdgavaraOdabranimUvijetima));
        }

        private bool provjeriDaLiElementOdgavaraOdabranimUvijetima(ServisniListVizual trenutniLement)
        {
            string zaprimateljVrijednost = txtZaprimateljVrijednost.Text.Trim();
            string strankaVrijednost = txtStrankaVrijednost.Text.Trim();
            string serviserVrijednost = txtServiserVrijednost.Text.Trim();

            if (
                    (dtpTrazeniDatumDo.Checked && ((DateTime)dtpTrazeniDatumDo.Value).Date < trenutniLement.DatumPrimitka.Date)
                    ||
                    (dtpTrazeniDatumOd.Checked && ((DateTime)dtpTrazeniDatumOd.Value).Date > trenutniLement.DatumPrimitka.Date)
                    ||
                    (!string.IsNullOrEmpty(zaprimateljVrijednost) && !trenutniLement.Zaprimatelj.Equals(zaprimateljVrijednost))
                    ||
                    (!string.IsNullOrEmpty(strankaVrijednost) && !trenutniLement.Stranka.Equals(strankaVrijednost))
                    ||
                (!string.IsNullOrEmpty(serviserVrijednost) && !(trenutniLement.Zatvaratelj != null && trenutniLement.Zatvaratelj.Equals(serviserVrijednost)))
               )
            {
                return false;
            }

            return true;
        }

        private List<ServisniListVizual> dohvatiListoveUzavisnostiOKorisniku(bool admin)
        {
            if (admin)
            {
                return (
                        from item in context.Lists
                        orderby item.DatumPrimitka
                        select new ServisniListVizual()
                        {
                            BrojLista = item.BrojLista,
                            ZaprimljenoUPnp = item.ZaprimljenoUPnp,
                            Stranka = item.Stranka.Naziv,
                            DatumPrimitka = item.DatumPrimitka,
                            Zaprimatelj = item.Zaprimatelj.Simbol,
                            Zatvaratelj = item.Serviser.Simbol,
                            DatumZatvaranja = item.DatumZatvaranja,
                            IsporukaUPnp = item.IsporukaUPnp,
                            DatumIsporuke = item.DatumIsporuke,
                            UtrosenoVrijemeRada = item.UtrosenoVrijemeRada
                        }
                    ).ToList();
            }

            return (
                        from item in context.Lists
                        orderby item.DatumPrimitka
                        where item.DatumZatvaranja == null
                        select new ServisniListVizual()
                        {
                            BrojLista = item.BrojLista,
                            ZaprimljenoUPnp = item.ZaprimljenoUPnp,
                            Stranka = item.Stranka.Naziv,
                            DatumPrimitka = item.DatumPrimitka,
                            Zaprimatelj = item.Zaprimatelj.Simbol,
                            Zatvaratelj = item.Serviser.Simbol,
                            DatumZatvaranja = item.DatumZatvaranja,
                            IsporukaUPnp = item.IsporukaUPnp,
                            DatumIsporuke = item.DatumIsporuke,
                            UtrosenoVrijemeRada = item.UtrosenoVrijemeRada
                        }
                    ).ToList();
        }

        #endregion

    }
}
